home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROCS.ZIP / SCANSET.ICN < prev    next >
Text File  |  1992-11-20  |  2KB  |  61 lines

  1. ############################################################################
  2. #
  3. #    File:     scanset.icn
  4. #
  5. #    Subject:  Procedures to set up string scanning procedures
  6. #
  7. #    Author:   Robert J. Alexander
  8. #
  9. #    Date:     November 11, 1991
  10. #
  11. ###########################################################################
  12. #
  13. #  Procedure to set up for user-written string-scanning procedures that
  14. #  are in the spirit of Icon's built-ins.
  15. #
  16. #  The values passed are the s, i1, i2 parameters which are the last
  17. #  three arguments to all Icon scanning functions (such as
  18. #  upto(c,s,i1,i2)).  scan_setup() supplies any appropriate defaults and
  19. #  returns needed values.
  20. #  The value returned is a list consisting of two values:
  21. #
  22. #    1.  The substring of s to be scanned (ss).
  23. #    2.  The size of the substring of s that precedes the
  24. #        substring to be scanned (len).
  25. #
  26. #  scan_setup() fails if i1 or i2 is out of range with respect to s.
  27. #
  28. #  The user-written procedure can then match in the string ss to compute
  29. #  the position within ss appropriate to the scan (p).  The value
  30. #  returned (or suspended) to the caller is p + len (the position within
  31. #  the original string, s).
  32. #
  33. #  For example, the following function finds two words separated by
  34. #  spaces:
  35. #
  36. #    procedure two_words(s,i1,i2)
  37. #       local x,p
  38. #       x := scan_setup(s,i1,i2) | fail    # fail if out of range
  39. #       x[1] ? suspend {
  40. #          tab(upto(&letters)) &
  41. #          pos(1) | (move(-1) & tab(any(~&letters))) &
  42. #          p := &pos &        # remember starting position
  43. #          tab(many(&letters)) &
  44. #          tab(many(' ')) &
  45. #          tab(many(&letters)) &
  46. #          p + x[2]            # return position in original s
  47. #          }
  48. #    end
  49. #
  50. ############################################################################
  51.  
  52. procedure scan_setup(s,i1,i2)
  53.    if /s := &subject then
  54.       /i1 := &pos
  55.    else
  56.       /i1 := 1
  57.    /i2 := 0
  58.    return [s[i1:i2],match("",s,i1,i2) - 1]
  59. end
  60.